using System;
using System.Linq;
using FoundationLib.Ifc.Logging.Configuration;

namespace FoundationLib.Ifc.Logging 
{
	/// <summary>
	/// This interface exposes methods used by technical loggers.
	/// </summary>
	public interface ITechnicalLogger 
	{
		/// <summary>
		/// Gets or sets the logger configuration.
		/// </summary>
		LoggerConfigElement Configuration
		{
			get;
			set;
		}

		/// <summary>Logs a debug message.</summary>
		/// <param name="message">The message to log</param>
		void Debug(Object message);

		/// <summary>Logs a debug message.</summary>
		/// <param name="message">The message</param>
		/// <param name="exception">The occurring exception</param>
		void Debug(Object message, Exception exception);

		/// <summary>Logs a debug message.</summary>
		/// <param name="format">The message format</param>
		/// <param name="args">The message arguments</param>
		void DebugFormat(String format, params Object[] args);

		/// <summary>Logs an error message.</summary>
		/// <param name="message">The message to log</param>
		void Error(Object message);

		/// <summary>Logs an error message.</summary>
		/// <param name="message">The message to log</param>
		/// <param name="exception">The occurring exception</param>
		void Error(Object message, Exception exception);

		/// <summary>Logs an error message.</summary>
		/// <param name="format">The message format</param>
		/// <param name="args">The message arguments</param>
		void ErrorFormat(String format, params Object[] args);

		/// <summary>Logs a fatal error message.</summary>
		/// <param name="message">The message to log</param>
		void Fatal(Object message);

		/// <summary>Logs a fatal error message.</summary>
		/// <param name="message">The message to log</param>
		/// <param name="exception">The occurring exception</param>
		void Fatal(Object message, Exception exception);

		/// <summary>Logs a fatal error message.</summary>
		/// <param name="format">The message format</param>
		/// <param name="args">The message arguments</param>
		void FatalFormat(String format, params Object[] args);

		/// <summary>Logs an info message.</summary>
		/// <param name="message">The message</param>
		void Info(Object message);

		/// <summary>Logs an info message.</summary>
		/// <param name="message">The message</param>
		/// <param name="exception">An exception to log</param>
		void Info(Object message, Exception exception);

		/// <summary>Logs an info message</summary>
		/// <param name="format">The message format</param>
		/// <param name="args">The message arguments</param>
		void InfoFormat(String format, params Object[] args);

		/// <summary>Logs a warning message.</summary>
		/// <param name="message">The message</param>
		void Warn(Object message);

		/// <summary>Logs a warning message.</summary>
		/// <param name="message">The message</param>
		/// <param name="exception">The exception</param>
		void Warn(Object message, Exception exception);

		/// <summary>Logs a warning message.</summary>
		/// <param name="format">The message format</param>
		/// <param name="args">The message arguments</param>
		void WarnFormat(String format, params Object[] args);
	}

}